#include "AltaMovimiento.h"
#include "ui_AltaMovimiento.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel  *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;

/*
 * Constructor de la clase AltaMovimiento
 */
AltaMovimiento::AltaMovimiento(QWidget *parent) :
    QWidget(parent),
    mov_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::AltaMovimiento)
{
    ui->setupUi(this);
    setWindowTitle("Alta Movimiento");
    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowModality(Qt::WindowModal);

    mov_model->setTable("movimiento");

    ui->fecha_mov->setFocus();

    QDate date;
    ui->fecha_mov->setDate(date.currentDate());

    connect(ui->comboBox_moneda,SIGNAL(currentIndexChanged(int)),this,SLOT(HabilitarIdMoneda()));

    CargarPersonas();
    CargarConceptos();

    connect(ui->cancel_btn,SIGNAL(clicked()),this,SLOT(CancelButton()));
    connect(ui->save_btn,SIGNAL(clicked()),this,SLOT(SaveButton()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(SaveButton()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

/*
 * Destructor de la clase AltaMovimiento.
 */
AltaMovimiento::~AltaMovimiento()
{
    delete ui;
}

/*
 * Acción del botón cerrar.
 */
void AltaMovimiento::CancelButton()
{
    close();
}

/*
 * Acción del botón guardar.
 */
void AltaMovimiento::SaveButton()
{
    QSqlRecord record;

    if (ui->fecha_mov->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Fecha no puede ser vacío");
        return;
    } else {
        QSqlField fmField(QStringLiteral("fecha_mov"), QVariant::Date);
        fmField.setValue(ui->fecha_mov->text());
        record.append(fmField);
    }

    if (ui->comboBox_moneda->itemText(ui->comboBox_moneda->currentIndex()).isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Tipo moneda no puede ser vacío");
        return;
    } else {
        QSqlField monedaField(QStringLiteral("tipo_moneda"), QVariant::String);
        monedaField.setValue(ui->comboBox_moneda->itemText(ui->comboBox_moneda->currentIndex()));
        record.append(monedaField);
    }

    if (ui->comboBox_moneda->itemText(ui->comboBox_moneda->currentIndex()) == "Cheque") {
        QMessageBox::information(this,"Aviso!", "Para cargar un cheque hagalo dese el Mósulo Cheques.");
        close();
    }

    if (ui->idMoneda->isEnabled() && ui->idMoneda->text().isEmpty()){
        QMessageBox::warning(this,"Advertencia!", "El campo Nro. moneda no puede ser vacío");
        return;
    } else {
        QSqlField idMonedaField(QStringLiteral("idMoneda"), QVariant::String);
        idMonedaField.setValue(ui->idMoneda->text());
        record.append(idMonedaField);
    }

    if (ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()).isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Persona no puede ser vacío");
        return;
    } else {
        QSqlField mpersonaField(QStringLiteral("m_persona"), QVariant::String);
        mpersonaField.setValue(ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()));
        record.append(mpersonaField);
    }

    if (ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()).isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Concepto no puede ser vacío");
        return;
    } else {
        QSqlField mconceptoField(QStringLiteral("m_concepto"), QVariant::String);
        mconceptoField.setValue(ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()));
        record.append(mconceptoField);
    }

    if (ui->debe->text().isEmpty()) {
        ui->debe->setText("0,00");
    }
    QSqlField debeField(QStringLiteral("debe"), QVariant::Double);
    debeField.setValue(ui->debe->text().toFloat());
    record.append(debeField);

    if (ui->haber->text().isEmpty()) {
        ui->haber->setText("0,00");
    }
    QSqlField haberField(QStringLiteral("haber"), QVariant::Double);
    haberField.setValue(ui->haber->text().toFloat());
    record.append(haberField);

    enjoylifedb.transaction();
    if (!(mov_model->insertRecord(-1, record))) {
        QString error = mov_model->lastError().text();
        QMessageBox::critical(this,"Error!", tr("No se pudo insertar el movimiento, intentelo de nuevo."
                                                "\n %1").arg(error));
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    ResetUi();
    UpdateMovimientosList();
//    CalcularSaldoMensual();
}

/*
 * Carga personas en el comboBox.
 */
void AltaMovimiento::CargarPersonas()
{
    // Carga las personas de la pabla persona
    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    QString stm2= "select persona from persona where estado is null or estado <> 'BAJA' order by persona";

    if (! query2->exec(stm2)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query2->lastError().text());
        return;
    }
    ui->comboBox_Persona->addItem("");
    while (query2->next()) {
        ui->comboBox_Persona->addItem(query2->value(query2->record().indexOf("persona")).toString());
    }
}

/**
 * @brief AltaMovimiento::CargarConceptos
 */
void AltaMovimiento::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto->addItem("");
    while (query->next()) {
        ui->comboBox_concepto->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

/*
 * Resetea los valores de la Ui.
 */
void AltaMovimiento::ResetUi()
{
    QDate date;
    ui->fecha_mov->setDate(date.currentDate());
    ui->comboBox_moneda->setCurrentIndex(0);
    ui->comboBox_Persona->setCurrentIndex(0);
    ui->comboBox_concepto->setCurrentIndex(0);
    ui->debe->setText("0.00");
    ui->haber->setText("0.00");
//    SaldoAlaFecha();
}

/*
 * Acción del boton: Actualiza la lista de moviemientos.
 */
void AltaMovimiento::UpdateMovimientosList()
{
    QDate date;
    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);

    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) <= '" + mes + "'";
    enjoylifedb.transaction();
    movimientos_model->setTable("movimiento");
    movimientos_model->filter().clear();
    movimientos_model->setFilter(filtroMov);
    if (!(movimientos_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
//    saldo_line2->setText("0.00");
    CorrectViewOfModel();
    CalcularSaldoMensual();
}

void AltaMovimiento::CorrectViewOfModel()
{
    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
    movimientos_model->setHeaderData(6,Qt::Horizontal,"Cobro");
    movimientos_model->setHeaderData(7,Qt::Horizontal,"Pago");

    movimientos_view->setModel(movimientos_model);
    movimientos_view->setCornerButtonEnabled(true);
    movimientos_view->setAlternatingRowColors(true);
    movimientos_view->setGridStyle(Qt::SolidLine);
    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    movimientos_view->setWordWrap(true);
    movimientos_view->sortByColumn(1,Qt::SortOrder());
    movimientos_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    movimientos_view->hideColumn(0);
    movimientos_view->hideColumn(5);
    movimientos_view->hideColumn(8);
    movimientos_view->scrollToBottom();
}

/*
 *
 */
void AltaMovimiento::CalcularSaldoMensual()
{
//    QDate date;
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);
//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";

    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento "; /*where " + filtroMov;*/
    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
                              "intentelo nuevamente || " + query->lastError().text());
        enjoylifedb.rollback();
        return;
    }

    double sumDebe = 0;
    double sumHaber = 0;
    while (query->next()) {
        if (query->last()) {
            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
        }
    }
    QVariant val = sumDebe - sumHaber;
    const int precision = 2;
    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

    enjoylifedb.commit();
}

/**
 * @brief AltaMovimiento::HabilitarIdMoneda
 */
void AltaMovimiento::HabilitarIdMoneda()
{
    if (ui->comboBox_moneda->currentIndex() == 1) {
        ui->idMoneda->setEnabled(false);
    }
    if (ui->comboBox_moneda->currentIndex() == 2) {
        ui->idMoneda->setEnabled(true);
    }
    if (ui->comboBox_moneda->currentIndex() == 3) {
        ui->idMoneda->setEnabled(true);
    }
//    if (ui->comboBox_moneda->currentIndex() == 4) {
//        ui->idMoneda->setEnabled(true);
//    }
}
